Spring Security তে OncePerRequestFilter এবং GenericFilterBean দুটি ক্লাস হল ফিল্টার যা HTTP অনুরোধের প্রক্রিয়াকরণের সময় কাস্টম ফিল্টার যুক্ত করতে ব্যবহৃত হয়। এগুলো সাধারণত বিশেষভাবে কাস্টম অথেন্টিকেশন, অথোরাইজেশন, লগিং, বা অন্যান্য নিরাপত্তা বৈশিষ্ট্য বাস্তবায়ন করতে ব্যবহৃত হয়।
OncePerRequestFilter
OncePerRequestFilter হল একটি abstract ক্লাস যা Spring Security এবং অন্যান্য Spring-ভিত্তিক অ্যাপ্লিকেশনে ফিল্টার ব্যবহার করার জন্য অত্যন্ত উপকারী। এর মূল সুবিধা হল যে এটি শুধুমাত্র একটি নির্দিষ্ট HTTP অনুরোধের জন্য একবার কার্যকর হয়, যাতে একাধিক ফিল্টার একসাথে একই রিকোয়েস্ট প্রক্রিয়াকরণ না করে।
কীভাবে কাজ করে:
OncePerRequestFilter একটি রিকোয়েস্টের জন্য একবার কাস্টম ফিল্টার চলবে, যা সাধারণত ফিল্টার চেইনে সঠিক সময়ে চালানো হয়। এটি doFilterInternal মেথডে কাস্টম লজিক রচনা করতে দেয়, যেখানে অনুরোধের প্রক্রিয়া নিয়ন্ত্রণ করা হয়।
OncePerRequestFilter ব্যবহার করার উদাহরণ:
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.filter.Filter;
import org.springframework.web.util.WebUtils;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class CustomOncePerRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// Filter logic here (For example, logging or authentication checks)
String userAgent = request.getHeader("User-Agent");
System.out.println("User-Agent: " + userAgent);
// Pass the request along the filter chain
filterChain.doFilter(request, response);
}
}
SecurityConfig এ OncePerRequestFilter কনফিগার করা:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.addFilterBefore(new CustomOncePerRequestFilter(), OncePerRequestFilter.class)
.authorizeRequests()
.anyRequest().authenticated();
return http.build();
}
}
এখানে addFilterBefore ব্যবহার করে আমরা OncePerRequestFilter ফিল্টারটিকে Spring Security ফিল্টার চেইনে যোগ করেছি। এটি একটি নির্দিষ্ট ফিল্টারের আগে বা পরে চলতে পারে (যেমন OncePerRequestFilter.class এখানে ব্যবহার করা হয়েছে)।
GenericFilterBean
GenericFilterBean একটি সিম্পল Spring Bean যা একটি কাস্টম ফিল্টার তৈরি করতে ব্যবহৃত হয়। এটি javax.servlet.Filter ইন্টারফেস বাস্তবায়ন করে এবং সাধারণত অতিরিক্ত লজিক এবং ফিল্টারিং ফিচারের জন্য ব্যবহৃত হয়।
কীভাবে কাজ করে:
GenericFilterBean এর মাধ্যমে আপনি নিজস্ব কাস্টম ফিল্টার তৈরি করতে পারেন যা doFilter মেথডে অনুরোধ প্রক্রিয়া করার সময় অতিরিক্ত লজিক প্রয়োগ করতে দেয়।
GenericFilterBean ব্যবহার করার উদাহরণ:
import org.springframework.web.filter.GenericFilterBean;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class CustomGenericFilterBean extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// Custom filter logic (Example: logging)
System.out.println("Request received: " + request.getRemoteAddr());
// Continue the request-response chain
chain.doFilter(request, response);
}
}
SecurityConfig এ GenericFilterBean কনফিগার করা:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.addFilterBefore(new CustomGenericFilterBean(), GenericFilterBean.class)
.authorizeRequests()
.anyRequest().authenticated();
return http.build();
}
}
এখানে addFilterBefore ব্যবহার করে আমরা CustomGenericFilterBean ফিল্টারটিকে Spring Security ফিল্টার চেইনে যুক্ত করেছি।
OncePerRequestFilter vs GenericFilterBean: পার্থক্য
| বৈশিষ্ট্য | OncePerRequestFilter | GenericFilterBean |
|---|---|---|
| নির্ধারণ | শুধুমাত্র একবার ফিল্টার চালানো হয়। | সাধারণ ফিল্টার যা অনুরোধ প্রক্রিয়া চলাকালীন একাধিক বার চলতে পারে। |
| কাস্টম ফিল্টারিং | প্রক্রিয়া একবার হবে। (উদাহরণস্বরূপ, রিকোয়েস্টের উপর একক চেক) | অনুরোধের প্রতি বার ফিল্টারিং চালানো যায়। |
| ব্যবহার | এক্সপেনশন প্রয়োজন যেখানে আপনি একবার একটি রিকোয়েস্ট প্রক্রিয়া করতে চান। | সাধারণ ফিল্টার লগিকের জন্য, যেমন লগিং বা জটিল কাস্টম প্রক্রিয়াকরণ। |
কেন OncePerRequestFilter এবং GenericFilterBean ব্যবহার করবেন?
OncePerRequestFilter: এটি ব্যবহার করা হয় যখন আপনি একটি অনুরোধের জন্য একবার কাস্টম ফিল্টার চালাতে চান (যেমন লগিং, সেশন ম্যানেজমেন্ট বা অন্যান্য নিরাপত্তা যাচাই)। এটি ফিল্টার চেইনের একটি নির্দিষ্ট স্থানে একবার চলবে, যা সাধারণত অথেন্টিকেশন বা অথোরাইজেশন ফিল্টারের আগে ব্যবহৃত হয়।GenericFilterBean: এটি সাধারণ কাস্টম ফিল্টারের জন্য উপযুক্ত। আপনি যখন আরও জটিল লগিক বা একাধিক ফিল্টারিং চালাতে চান এবং একাধিক বার ফিল্টার প্রয়োগ করতে চান তখন এটি ব্যবহার করা হয়।
উপসংহার
OncePerRequestFilter এবং GenericFilterBean Spring Security এবং Spring Framework এ কাস্টম ফিল্টারিং প্রক্রিয়া পরিচালনার জন্য অত্যন্ত শক্তিশালী উপায়। OncePerRequestFilter একক অনুরোধের জন্য একবার ফিল্টার চালানোর জন্য উপযুক্ত, যেখানে GenericFilterBean এর মাধ্যমে আপনি আরও জটিল বা একাধিক ফিল্টারিং প্রক্রিয়া করতে পারেন।
Read more